const path = require("path");
const fs = require("fs-extra");
const glob = require("glob");
const JavaScriptObfuscator = require("javascript-obfuscator");

// 混淆配置
const obfuscationOptions = {
  compact: true, // 压缩代码
  // controlFlowFlattening: true, // 控制流扁平化
  // deadCodeInjection: true, // 注入无用代码
  debugProtection: true, // 防止调试
  disableConsoleOutput: true, // 禁用 console.log
  renameGlobals: true, // 重命名全局变量
  selfDefending: true, // 自保护（防止格式化）
  stringArray: true, // 字符串数组化
  stringArrayEncoding: ["base64"], // 字符串编码
  stringArrayThreshold: 0.75, // 字符串数组化阈值
  // unicodeEscapeSequence: true // 使用 Unicode 转义序列
};

// 要混淆的目录
const inputDir = path.join(__dirname, "src"); // 你的源代码目录
const outputDir = path.join(__dirname, "obfuscated"); // 混淆后的输出目录

// 清空输出目录
fs.emptyDirSync(outputDir);

// 获取所有 .js 文件
const files = glob.sync("**/*.js", { cwd: inputDir });

// 批量混淆
files.forEach((file) => {
  const filePath = path.join(inputDir, file);
  const outputPath = path.join(outputDir, file);

  // 读取文件内容
  const code = fs.readFileSync(filePath, "utf8");

  // 混淆代码
  const obfuscatedCode = JavaScriptObfuscator.obfuscate(
    code,
    obfuscationOptions
  ).getObfuscatedCode();

  // 确保输出目录存在
  fs.ensureDirSync(path.dirname(outputPath));

  // 写入混淆后的代码
  fs.writeFileSync(outputPath, obfuscatedCode, "utf8");

  console.log(`Obfuscated: ${file} -> ${outputPath}`);
});

//移动静态资源

// 定义路径
const srcDir = path.join(__dirname, "src");
const targetDir = path.join(__dirname, "obfuscated");
const resourceDirNames = ["assets", "sql"];

function copyFolder(srcDir, destDir) {
  // 如果目标文件夹不存在，则创建它
  if (!fs.existsSync(destDir)) {
    fs.mkdirSync(destDir, { recursive: true });
  }

  // 读取源文件夹内容
  const files = fs.readdirSync(srcDir);

  files.forEach((file) => {
    const srcPath = path.join(srcDir, file);
    const destPath = path.join(destDir, file);
    const stat = fs.statSync(srcPath);

    if (stat.isDirectory()) {
      // 如果是子文件夹，递归复制
      copyFolder(srcPath, destPath);
    } else {
      // 如果是文件，直接复制
      fs.copyFileSync(srcPath, destPath);
      console.log(`Copied: ${srcPath} -> ${destPath}`);
    }
  });
}

for (const r of resourceDirNames) {
  // 检查目标文件夹是否存在
  if (!fs.existsSync(targetDir)) {
    console.error(`Error: Directory ${targetDir} does not exist.`);
    process.exit(1);
  }
  // 复制文件夹
  copyFolder(path.join(srcDir, r), path.join(targetDir, r));
}

//移动渲染进程项目
copyFolder(path.join(__dirname,"platform","dist"),path.join(__dirname,"obfuscated","platform"))


console.log("Obfuscation complete!");
